docs: shared-content architecture with per-SDK fan-out#404
Conversation
content/docs/shared/x.mdx now serves /{python,node,java}/x from one file. Slug+fan-out logic centralized in doc-slugs.ts; loader, prerender walk, and manifest resolve through it (slug collision = build error). Alias mounts carry a canonical link; llms.txt dedupes to the canonical URL.
Shared pages ship all SDK variants; without URL precedence a fresh visit to /node/... painted the default SDK until hydration.
check:parity blocks on missing CodeTabs SDK coverage, slug collisions, and redirect shadowing; the drift report ranks per-SDK topics as the migration queue.
tasks, workers, queues, scheduling, predicates — one file per topic, per-SDK code via CodeTabs, per-SDK facts via SdkOnly.
retries, error-handling, guarantees, idempotency, circuit-breakers, locks. Python's locking page is normalized to locks; circuit-breakers joins java's nav (the SDK has the feature).
canvas, gates, saga. Python's sagas page is normalized to saga; inbound links updated.
serializers (incl. cross-SDK payload-codec wire contract), middleware (per-SDK hook tables).
Java keeps Micrometer; the prometheus page opts out of its nav.
deployment, testing, troubleshooting, keda, mesh.
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (11)
✅ Files skipped from review due to trivial changes (5)
🚧 Files skipped from review as they are similar to previous changes (6)
📝 WalkthroughWalkthroughShared documentation is mounted across SDK-specific routes with canonical metadata, while new parity checks validate shared MDX content before the docs build. Cross-SDK guides replace many SDK-specific pages, and legacy route references are redirected or updated. ChangesShared documentation system
Estimated code review effort: 5 (Critical) | ~120 minutes Sequence Diagram(s)sequenceDiagram
participant DocsBuild
participant Parity as check:parity
participant Content as Shared MDX
participant Manifest as Docs manifest
participant Browser
DocsBuild->>Parity: run parity checks
Parity->>Content: load shared pages
Parity-->>DocsBuild: report errors or success
DocsBuild->>Manifest: build SDK mount entries
Browser->>Manifest: request SDK-specific slug
Manifest-->>Browser: page metadata and canonical link
Possibly related PRs
Suggested labels: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 18
Note
Due to the large number of review comments, Critical, Major severity comments were prioritized as inline comments.
🟡 Minor comments (15)
docs/content/docs/shared/getting-started/quickstart.mdx-231-231 (1)
231-231: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winCorrect the sample queue statistics.
This walkthrough enqueues one job, so a successful run should show
completed: 1, notcompleted: 5. Use1or placeholder values to keep the output consistent with the preceding steps.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@docs/content/docs/shared/getting-started/quickstart.mdx` at line 231, The quickstart queue statistics sample shows an incorrect completed-job count. Update the displayed output from completed: 5 to completed: 1, keeping the other values consistent with the preceding steps.docs/content/docs/shared/guides/core/scheduling.mdx-85-106 (1)
85-106: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winAvoid a permanently stale periodic payload.
Both examples pass
"2026-06-16"as a fixed argument, so every future daily run receives that same past date. Compute the date inside the handler or pass a scheduler-provided/current date instead.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@docs/content/docs/shared/guides/core/scheduling.mdx` around lines 85 - 106, Replace the hard-coded "2026-06-16" periodic argument in the Python digest handler and Node "digest" task registration with logic that derives the current run date inside each handler or uses a scheduler-provided date, ensuring every daily execution receives the correct date.docs/content/docs/shared/guides/resources/interception.mdx-304-309 (1)
304-309: 🔒 Security & Privacy | 🟡 Minor | ⚡ Quick winValidate the amount at runtime before the comparison.
as numberis compile-time only, so non-numeric values,NaN, andInfinitycan slip past this check. Use a runtime type/finite guard before rejecting.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@docs/content/docs/shared/guides/resources/interception.mdx` around lines 304 - 309, Update the chargeCard handler in the queue.intercept callback to validate args[0] at runtime before comparing it: require a number and Number.isFinite(args[0]), then reject invalid or negative amounts; otherwise return Interception.pass(). Remove reliance on the compile-time as number assertion.docs/content/docs/shared/guides/reliability/retries.mdx-92-100 (1)
92-100: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winKeep jitter within the documented maximum delay.
With
delay = min(M, B * 2^retry_count) + jitter, the actual delay can exceedM, despitemax_retry_delaybeing documented as a cap. Usemin(M, B * 2^retry_count + jitter)or clarify that the cap excludes jitter.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@docs/content/docs/shared/guides/reliability/retries.mdx` around lines 92 - 100, The retry delay formula in the reliability guide incorrectly allows jitter to exceed the documented maximum. Update the scheduler description to apply jitter before the cap, using min(M, B * 2^retry_count + jitter), and ensure the surrounding defaults or examples consistently describe M as the true maximum delay.docs/content/docs/shared/guides/workflows/canvas.mdx-551-554 (1)
551-554: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winCorrect the “No imports needed” comparison.
The Python canvas examples still import
chain,group,chord, andQueue. Change this to “No workflow-definition imports needed” or similar; the current wording is misleading.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@docs/content/docs/shared/guides/workflows/canvas.mdx` around lines 551 - 554, The comparison table’s “Setup” row incorrectly says Canvas requires no imports; update it to “No workflow-definition imports needed” or equivalent, reflecting the imports used by the canvas examples while distinguishing them from DAG workflow imports.docs/content/docs/shared/more/examples/benchmark.mdx-255-257 (1)
255-257: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick winUse the actual TypeScript runner here.
docs/package.jsondoesn’t definetsx/ts-node, sonode benchmark.tsisn’t runnable as written; replace it with the repo’s documented command or a compile-then-run step.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@docs/content/docs/shared/more/examples/benchmark.mdx` around lines 255 - 257, Replace the `node benchmark.ts` command in the benchmark example with the repository’s documented TypeScript execution command, or provide commands that compile `benchmark.ts` and then run the generated JavaScript; ensure the documented steps work with the dependencies defined in `docs/package.json`.docs/content/docs/shared/guides/extensibility/serializers.mdx-249-253 (1)
249-253: 🔒 Security & Privacy | 🟡 Minor | ⚡ Quick winDescribe the encryption strength accurately.
The page calls
EncryptedSerializerAES-256-GCM, but the documented key lengths also allow AES-128 and AES-192. Use “AES-GCM” generally and state that strength depends on key length.Also applies to: 414-422
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@docs/content/docs/shared/guides/extensibility/serializers.mdx` around lines 249 - 253, Update the EncryptedSerializer description to refer to AES-GCM rather than AES-256-GCM, and state that encryption strength depends on the configured key length, including the supported AES-128, AES-192, and AES-256 variants. Apply the same wording to the corresponding repeated section.docs/content/docs/shared/guides/operations/troubleshooting.mdx-461-462 (1)
461-462: 🚀 Performance & Scalability | 🟡 Minor | ⚡ Quick winClarify Postgres and Redis space reclamation.
Standard Postgres autovacuum reuses free space but does not necessarily shrink files, and Redis key expiry is not automatic when the page says Node/Java have no built-in TTL. Clarify that SQLite needs
VACUUM, Postgres reuses space through vacuuming, and Redis deletion/expiry depends on configuration.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@docs/content/docs/shared/guides/operations/troubleshooting.mdx` around lines 461 - 462, Update the disk-space reclamation guidance after purging: state that SQLite requires VACUUM, Postgres vacuuming generally reuses free space without necessarily shrinking database files, and Redis deletion or key expiry depends on its configured expiration and cleanup behavior. Align the surrounding Node/Java TTL wording with this clarification.docs/content/docs/shared/guides/operations/testing.mdx-657-669 (1)
657-669: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick winClose the worker in the synchronization example.
The snippet creates a worker without stopping or closing it, despite the later warning that leaked workers continue polling across tests. Use try-with-resources or a
finallyblock.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@docs/content/docs/shared/guides/operations/testing.mdx` around lines 657 - 669, Update the synchronization example to ensure the Worker created in the CountDownLatch snippet is closed after use, using try-with-resources or a finally block around the worker lifecycle. Keep the existing event registration and synchronization behavior intact.docs/content/docs/shared/guides/extensibility/middleware.mdx-171-174 (1)
171-174: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winDocument Python’s enqueue-hook signature separately.
Python receives mutable
task_name,args,kwargs, andoptions; it does not receive anEnqueueContextobject as implied here. Clarify the wording for Python versus Node/Java.Suggested wording
- the context it receives is **mutable** — use it to validate, redact, or reshape what actually gets enqueued. + the enqueue arguments are mutable — in Python, use `args`, `kwargs`, and `options`; Node and Java expose a mutable enqueue context.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@docs/content/docs/shared/guides/extensibility/middleware.mdx` around lines 171 - 174, Update the on_enqueue/onEnqueue documentation to distinguish Python from Node/Java: explain that Python’s hook receives mutable task_name, args, kwargs, and options directly, while Node/Java receive a mutable EnqueueContext object; remove wording that implies Python receives EnqueueContext.docs/content/docs/shared/guides/operations/testing.mdx-482-505 (1)
482-505: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winAssert the
waitForresult.
waitForreturnsfalseon timeout, but this example ignores the return value. The example can therefore pass even when the resource is never resolved.- await waitFor(() => db.resolutions === 1); + expect(await waitFor(() => db.resolutions === 1)).toBe(true);🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@docs/content/docs/shared/guides/operations/testing.mdx` around lines 482 - 505, Update the `mockResource()` example to assert that `waitFor` returns true, rather than ignoring its result. Wrap the existing `waitFor(() => db.resolutions === 1)` call in the documentation’s assertion mechanism so the example fails when the resource is not resolved within the timeout.docs/content/docs/shared/guides/operations/keda.mdx-316-320 (1)
316-320: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winUse metric-neutral wording for the shared KEDA manifests.
The prose describes pending jobs, but the Java scaler reports
pending + running. Consequently, the sametargetValuehas different scaling semantics across SDKs. Describe this as outstanding work or add explicit Java-specific guidance beside each manifest.Also applies to: 356-360
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@docs/content/docs/shared/guides/operations/keda.mdx` around lines 316 - 320, The shared KEDA manifest descriptions around “ScaledObject (HTTP trigger)” must avoid SDK-specific “pending job count” wording because Java reports pending plus running work. Replace these references with metric-neutral wording such as “outstanding work,” including the corresponding section around the other affected manifest, or add explicit Java-specific guidance beside each manifest.docs/content/docs/shared/guides/integrations/sentry.mdx-1-3 (1)
1-3: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winAlign the page description with the Java event tags.
The frontmatter promises task name, job ID, and queue tags, but the Java section documents only
taskito.taskandtaskito.job. Either add the queue tag to Java events or qualify the description as SDK-specific.Suggested metadata correction
-description: "Report task failures to Sentry, tagged by task name, job id, and queue." +description: "Report task failures to Sentry with SDK-specific task and job metadata."Also applies to: 139-148
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@docs/content/docs/shared/guides/integrations/sentry.mdx` around lines 1 - 3, Update the Sentry page frontmatter description to accurately reflect the documented Java event tags: either document and implement the queue tag for Java events, or qualify the description as applying only to SDKs that provide it. Keep the metadata consistent with the Java section describing taskito.task and taskito.job.docs/content/docs/shared/guides/operations/deployment.mdx-274-279 (1)
274-279: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winAdd or remove the missing
ENVdeclaration.The callout says to keep an
ENV TASKITO_DB_PATH=...line from the Dockerfile above, but that line is absent. Add it nearVOLUME /data, or remove the reference so the instructions match the displayed Dockerfile.Suggested fix
# Store the database in a volume VOLUME /data +ENV TASKITO_DB_PATH=/data/taskito.db🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@docs/content/docs/shared/guides/operations/deployment.mdx` around lines 274 - 279, Add the missing `ENV TASKITO_DB_PATH=...` declaration to the displayed Dockerfile example near `VOLUME /data`, or update the callout to remove its reference; ensure the deployment instructions and Dockerfile remain consistent.docs/scripts/parity/checks/drift.mjs-18-24 (1)
18-24: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winNormalize topics through the shared slug helper.
topicOftreatsguides/foo/index.mdxandguides/foo.mdxas different topics, even though the routing contract maps them to the same URL. This can silently miss SDK drift during migrations.Proposed fix
-import { isSdk } from "../../../app/lib/sdk-registry.ts"; +import { isSdk } from "../../../app/lib/sdk-registry.ts"; +import { relPathToSlug } from "../../../app/lib/doc-slugs.ts"; function topicOf(rel) { - const [head, ...rest] = rel.split("/"); - if (!isSdk(head) || rest.length === 0) { + const [, sdk, ...topicParts] = relPathToSlug(rel).split("/"); + if (!isSdk(sdk) || topicParts.length === 0) { return null; } - const topic = rest.join("/").replace(/\.mdx$/, ""); + const topic = topicParts.join("/"); - return { sdk: head, topic: NAME_EQUIVALENTS.get(topic) ?? topic }; + return { sdk, topic: NAME_EQUIVALENTS.get(topic) ?? topic }; }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@docs/scripts/parity/checks/drift.mjs` around lines 18 - 24, Normalize the topic path in topicOf using the shared slug helper before applying NAME_EQUIVALENTS, so directory index paths such as guides/foo/index.mdx resolve to the same topic as guides/foo.mdx. Preserve the existing SDK validation and return structure, and locate the shared helper already used for route slug normalization.
🧹 Nitpick comments (1)
docs/app/lib/manifest.ts (1)
10-12: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winShare
DocMetaacross the docs manifest boundary
docs/app/virtual-docs-manifest.d.tsonly typesDOCS; it doesn’t bridgeDocMeta, sodocs/app/lib/manifest.tsanddocs/vite-plugin-docs-manifest.tsstill duplicate the same shape. A shared type-only module would remove the drift risk with no runtime cost.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@docs/app/lib/manifest.ts` around lines 10 - 12, Introduce a shared type-only module defining DocMeta, then import and use it in both docs/app/lib/manifest.ts and docs/vite-plugin-docs-manifest.ts. Update docs/app/virtual-docs-manifest.d.ts to re-export or reference the shared DocMeta type while retaining the DOCS declaration, and remove the duplicated DocMeta shape from both consumers.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/content/docs/shared/guides/core/predicates.mdx`:
- Around line 6-9: Update the predicate definition near the SdkSwap registration
examples to clarify that denial may either reject/cancel the job or defer it,
depending on the SDK and predicate outcome; remove the absolute statement that
no job is created and align the wording with the later Defer and Java defer(...)
examples.
In `@docs/content/docs/shared/guides/integrations/prometheus.mdx`:
- Around line 338-342: Update the “Alerting on high DLQ size” section to avoid
claiming taskito_dlq_size and taskito_jobs_total exist on every SDK. Scope the
Prometheus rules to Python and Node SDKs, and add Java-specific guidance using
Micrometer instead, consistent with the integration setup described earlier.
- Around line 344-361: Update the Prometheus alert examples under the taskito
rule group to avoid hardcoded taskito_ metric prefixes: use the documented
namespace placeholder or clearly instruct readers to replace it with their
configured namespace. Ensure both HighDLQSize and HighErrorRate expressions and
annotation text remain consistent with custom namespaces.
In `@docs/content/docs/shared/guides/operations/keda.mdx`:
- Around line 94-99: Update the Java scaler example to keep the process alive
after creating the Scaler: within the try-with-resources block, block until
shutdown using the Scaler API, and handle or propagate InterruptedException
while preserving resource cleanup.
In `@docs/content/docs/shared/guides/operations/mesh.mdx`:
- Around line 541-569: The documented Python entrypoint defines get_mesh() but
never starts the worker. Add a module-level queue.run_worker(mesh=get_mesh())
invocation after get_mesh() in myapp.py so the recommended python -m myapp
Compose command launches the worker.
In `@docs/content/docs/shared/guides/reliability/guarantees.mdx`:
- Around line 151-157: Replace the check-then-send example in the notify
function with a genuinely idempotent approach: use the email provider’s
idempotency key, an atomic database claim, or a transactional outbox. Ensure the
example prevents duplicate sends during concurrent execution and worker failure,
and update its “Good” labeling accordingly.
- Around line 6-10: Update the reliability guarantee in the section describing
exactly-once dispatch to avoid promising that jobs never execute concurrently.
Qualify the claim as no concurrent dispatch under normal atomic claims, and
clarify that timeout reaping may allow a retry to overlap an still-running task
unless fencing or cooperative cancellation is implemented.
In `@docs/content/docs/shared/guides/reliability/idempotency.mdx`:
- Around line 103-110: Define concrete producer-scope values for customerId and
amountCents before constructing the unique key and calling queue.enqueue, or
move key derivation and enqueue into a producer function that receives those
values; keep the queue.task callback parameters scoped only to its handler.
In `@docs/content/docs/shared/guides/workflows/canvas.mdx`:
- Around line 404-406: The canvas documentation incorrectly compensates the
failed step: update the with_compensation example to enqueue only refund when
step_b fails after step_a succeeds, and clarify that cancel_order runs only when
step_b completed before a later failure. Align the completed-step rule in
saga.mdx and the group rule with this behavior.
- Around line 282-285: The Chord description currently implies that member
results are passed to the callback. Update the text under the “Chord” heading to
state that the callback runs after the group completes, leaving result
aggregation behavior unspecified and SDK-specific.
In `@docs/content/docs/shared/guides/workflows/gates.mdx`:
- Around line 416-427: Update the deploy approval webhook examples in the
Python, Node, and Java sections to explicitly fail closed: before calling the
gate-resolution methods in deploy_approval and their equivalent handlers, invoke
placeholder authentication/signature verification and run-authorization helpers
such as verifyWebhookSignature(...) and authorizeRun(...), handling failed
checks by rejecting the request. Replace the comments-only security guidance so
copied examples cannot resolve gates using untrusted run_id or approved values.
In `@docs/content/docs/shared/guides/workflows/saga.mdx`:
- Around line 114-117: Make the Java snippet compile by replacing the standalone
expressions status.state and status.node("charge").orElseThrow().status with
valid statement expressions, preferably assertions verifying COMPENSATED for
both the workflow state and the charge node status.
In `@docs/content/docs/shared/more/examples/benchmark.mdx`:
- Around line 64-79: Update bench_process to wait for every submitted job before
calculating throughput: replace the single jobs[-1] result call with iteration
over all handles, applying the timeout consistently and stopping on
TimeoutError. Preserve timeout reporting and only compute elapsed time and rate
after all jobs complete.
- Around line 104-111: Standardize the Python benchmark methodology with the
Node and Java benchmarks: update the worker startup flow around
queue.run_worker, bench_enqueue, and bench_process so jobs are staged before the
worker starts and enqueue timing excludes worker/database contention;
alternatively, explicitly document the methodological difference if preserving
the current order.
- Around line 206-219: Update the processing-throughput section around the
taskito.worker() benchmark to enforce a deadline while draining, and inspect
taskito.stats() for failed jobs during polling. Exit or fail the benchmark when
the timeout expires or failures are detected, then only proceed to latency
sampling after successful completion.
- Around line 148-155: Bound the processing loop in the benchmark by adding a
deadline and checking both completed and failed job counts while polling
queue.stats(). Detect timeout or backend failure and surface a descriptive
error, and move worker.stop() into a finally block so the worker is always
stopped even when draining fails.
- Around line 136-158: Make the benchmark run against an isolated database per
execution, or record initial queue statistics and use deltas for the current
run. Update the processing loop to wait until this run’s N jobs complete, and
constrain the latency sample to jobs enqueued during this run rather than all
completed jobs. Adjust the setup around queue initialization and the
stats/listJobs logic in the benchmark accordingly.
In `@docs/scripts/parity/checks/code-tabs.mjs`:
- Line 10: Update TAB_RE to match sdk="..." regardless of the order of
attributes on the <Tab> tag, while preserving the existing SDK capture behavior;
also document the supported <Tab> attribute ordering or authoring rule in
README.md.
---
Minor comments:
In `@docs/content/docs/shared/getting-started/quickstart.mdx`:
- Line 231: The quickstart queue statistics sample shows an incorrect
completed-job count. Update the displayed output from completed: 5 to completed:
1, keeping the other values consistent with the preceding steps.
In `@docs/content/docs/shared/guides/core/scheduling.mdx`:
- Around line 85-106: Replace the hard-coded "2026-06-16" periodic argument in
the Python digest handler and Node "digest" task registration with logic that
derives the current run date inside each handler or uses a scheduler-provided
date, ensuring every daily execution receives the correct date.
In `@docs/content/docs/shared/guides/extensibility/middleware.mdx`:
- Around line 171-174: Update the on_enqueue/onEnqueue documentation to
distinguish Python from Node/Java: explain that Python’s hook receives mutable
task_name, args, kwargs, and options directly, while Node/Java receive a mutable
EnqueueContext object; remove wording that implies Python receives
EnqueueContext.
In `@docs/content/docs/shared/guides/extensibility/serializers.mdx`:
- Around line 249-253: Update the EncryptedSerializer description to refer to
AES-GCM rather than AES-256-GCM, and state that encryption strength depends on
the configured key length, including the supported AES-128, AES-192, and AES-256
variants. Apply the same wording to the corresponding repeated section.
In `@docs/content/docs/shared/guides/integrations/sentry.mdx`:
- Around line 1-3: Update the Sentry page frontmatter description to accurately
reflect the documented Java event tags: either document and implement the queue
tag for Java events, or qualify the description as applying only to SDKs that
provide it. Keep the metadata consistent with the Java section describing
taskito.task and taskito.job.
In `@docs/content/docs/shared/guides/operations/deployment.mdx`:
- Around line 274-279: Add the missing `ENV TASKITO_DB_PATH=...` declaration to
the displayed Dockerfile example near `VOLUME /data`, or update the callout to
remove its reference; ensure the deployment instructions and Dockerfile remain
consistent.
In `@docs/content/docs/shared/guides/operations/keda.mdx`:
- Around line 316-320: The shared KEDA manifest descriptions around
“ScaledObject (HTTP trigger)” must avoid SDK-specific “pending job count”
wording because Java reports pending plus running work. Replace these references
with metric-neutral wording such as “outstanding work,” including the
corresponding section around the other affected manifest, or add explicit
Java-specific guidance beside each manifest.
In `@docs/content/docs/shared/guides/operations/testing.mdx`:
- Around line 657-669: Update the synchronization example to ensure the Worker
created in the CountDownLatch snippet is closed after use, using
try-with-resources or a finally block around the worker lifecycle. Keep the
existing event registration and synchronization behavior intact.
- Around line 482-505: Update the `mockResource()` example to assert that
`waitFor` returns true, rather than ignoring its result. Wrap the existing
`waitFor(() => db.resolutions === 1)` call in the documentation’s assertion
mechanism so the example fails when the resource is not resolved within the
timeout.
In `@docs/content/docs/shared/guides/operations/troubleshooting.mdx`:
- Around line 461-462: Update the disk-space reclamation guidance after purging:
state that SQLite requires VACUUM, Postgres vacuuming generally reuses free
space without necessarily shrinking database files, and Redis deletion or key
expiry depends on its configured expiration and cleanup behavior. Align the
surrounding Node/Java TTL wording with this clarification.
In `@docs/content/docs/shared/guides/reliability/retries.mdx`:
- Around line 92-100: The retry delay formula in the reliability guide
incorrectly allows jitter to exceed the documented maximum. Update the scheduler
description to apply jitter before the cap, using min(M, B * 2^retry_count +
jitter), and ensure the surrounding defaults or examples consistently describe M
as the true maximum delay.
In `@docs/content/docs/shared/guides/resources/interception.mdx`:
- Around line 304-309: Update the chargeCard handler in the queue.intercept
callback to validate args[0] at runtime before comparing it: require a number
and Number.isFinite(args[0]), then reject invalid or negative amounts; otherwise
return Interception.pass(). Remove reliance on the compile-time as number
assertion.
In `@docs/content/docs/shared/guides/workflows/canvas.mdx`:
- Around line 551-554: The comparison table’s “Setup” row incorrectly says
Canvas requires no imports; update it to “No workflow-definition imports needed”
or equivalent, reflecting the imports used by the canvas examples while
distinguishing them from DAG workflow imports.
In `@docs/content/docs/shared/more/examples/benchmark.mdx`:
- Around line 255-257: Replace the `node benchmark.ts` command in the benchmark
example with the repository’s documented TypeScript execution command, or
provide commands that compile `benchmark.ts` and then run the generated
JavaScript; ensure the documented steps work with the dependencies defined in
`docs/package.json`.
In `@docs/scripts/parity/checks/drift.mjs`:
- Around line 18-24: Normalize the topic path in topicOf using the shared slug
helper before applying NAME_EQUIVALENTS, so directory index paths such as
guides/foo/index.mdx resolve to the same topic as guides/foo.mdx. Preserve the
existing SDK validation and return structure, and locate the shared helper
already used for route slug normalization.
---
Nitpick comments:
In `@docs/app/lib/manifest.ts`:
- Around line 10-12: Introduce a shared type-only module defining DocMeta, then
import and use it in both docs/app/lib/manifest.ts and
docs/vite-plugin-docs-manifest.ts. Update docs/app/virtual-docs-manifest.d.ts to
re-export or reference the shared DocMeta type while retaining the DOCS
declaration, and remove the duplicated DocMeta shape from both consumers.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 6eda2d19-ad62-4775-b433-f6c04ad1e349
📒 Files selected for processing (126)
.github/workflows/docs.ymldocs/README.mddocs/app/components/landing/scenario-finder.tsxdocs/app/lib/content.tsdocs/app/lib/doc-paths.tsdocs/app/lib/doc-slugs.tsdocs/app/lib/llms.tsdocs/app/lib/manifest.tsdocs/app/lib/redirects.tsdocs/app/lib/search.tsdocs/app/root.tsxdocs/app/routes/docs.$.tsxdocs/content/docs/java/getting-started/quickstart.mdxdocs/content/docs/java/guides/core/predicates.mdxdocs/content/docs/java/guides/core/queues.mdxdocs/content/docs/java/guides/core/scheduling.mdxdocs/content/docs/java/guides/core/tasks.mdxdocs/content/docs/java/guides/core/workers.mdxdocs/content/docs/java/guides/extensibility/middleware.mdxdocs/content/docs/java/guides/extensibility/serializers.mdxdocs/content/docs/java/guides/integrations/sentry.mdxdocs/content/docs/java/guides/operations/deployment.mdxdocs/content/docs/java/guides/operations/mesh.mdxdocs/content/docs/java/guides/operations/testing.mdxdocs/content/docs/java/guides/operations/troubleshooting.mdxdocs/content/docs/java/guides/reliability/error-handling.mdxdocs/content/docs/java/guides/reliability/guarantees.mdxdocs/content/docs/java/guides/reliability/idempotency.mdxdocs/content/docs/java/guides/reliability/locks.mdxdocs/content/docs/java/guides/reliability/meta.jsondocs/content/docs/java/guides/reliability/retries.mdxdocs/content/docs/java/guides/resources/interception.mdxdocs/content/docs/java/guides/workflows/canvas.mdxdocs/content/docs/java/guides/workflows/gates.mdxdocs/content/docs/java/guides/workflows/saga.mdxdocs/content/docs/java/more/examples/benchmark.mdxdocs/content/docs/node/getting-started/quickstart.mdxdocs/content/docs/node/guides/core/predicates.mdxdocs/content/docs/node/guides/core/queues.mdxdocs/content/docs/node/guides/core/scheduling.mdxdocs/content/docs/node/guides/core/tasks.mdxdocs/content/docs/node/guides/core/workers.mdxdocs/content/docs/node/guides/extensibility/middleware.mdxdocs/content/docs/node/guides/extensibility/serializers.mdxdocs/content/docs/node/guides/integrations/prometheus.mdxdocs/content/docs/node/guides/integrations/sentry.mdxdocs/content/docs/node/guides/operations/deployment.mdxdocs/content/docs/node/guides/operations/keda.mdxdocs/content/docs/node/guides/operations/mesh.mdxdocs/content/docs/node/guides/operations/testing.mdxdocs/content/docs/node/guides/operations/troubleshooting.mdxdocs/content/docs/node/guides/reliability/circuit-breakers.mdxdocs/content/docs/node/guides/reliability/error-handling.mdxdocs/content/docs/node/guides/reliability/guarantees.mdxdocs/content/docs/node/guides/reliability/idempotency.mdxdocs/content/docs/node/guides/reliability/locks.mdxdocs/content/docs/node/guides/reliability/retries.mdxdocs/content/docs/node/guides/resources/interception.mdxdocs/content/docs/node/guides/workflows/canvas.mdxdocs/content/docs/node/guides/workflows/gates.mdxdocs/content/docs/node/guides/workflows/saga.mdxdocs/content/docs/node/more/examples/benchmark.mdxdocs/content/docs/python/api-reference/queue/index.mdxdocs/content/docs/python/api-reference/saga.mdxdocs/content/docs/python/getting-started/quickstart.mdxdocs/content/docs/python/guides/core/queues.mdxdocs/content/docs/python/guides/core/scheduling.mdxdocs/content/docs/python/guides/core/tasks.mdxdocs/content/docs/python/guides/core/workers.mdxdocs/content/docs/python/guides/extensibility/middleware.mdxdocs/content/docs/python/guides/extensibility/serializers.mdxdocs/content/docs/python/guides/integrations/prometheus.mdxdocs/content/docs/python/guides/integrations/sentry.mdxdocs/content/docs/python/guides/operations/deployment.mdxdocs/content/docs/python/guides/operations/keda.mdxdocs/content/docs/python/guides/operations/mesh.mdxdocs/content/docs/python/guides/operations/troubleshooting.mdxdocs/content/docs/python/guides/reliability/circuit-breakers.mdxdocs/content/docs/python/guides/reliability/error-handling.mdxdocs/content/docs/python/guides/reliability/guarantees.mdxdocs/content/docs/python/guides/reliability/idempotency.mdxdocs/content/docs/python/guides/reliability/index.mdxdocs/content/docs/python/guides/reliability/locking.mdxdocs/content/docs/python/guides/reliability/meta.jsondocs/content/docs/python/guides/reliability/retries.mdxdocs/content/docs/python/guides/resources/interception.mdxdocs/content/docs/python/guides/workflows/canvas.mdxdocs/content/docs/python/guides/workflows/gates.mdxdocs/content/docs/python/guides/workflows/meta.jsondocs/content/docs/python/guides/workflows/sagas.mdxdocs/content/docs/python/more/examples/benchmark.mdxdocs/content/docs/shared/getting-started/quickstart.mdxdocs/content/docs/shared/guides/core/predicates.mdxdocs/content/docs/shared/guides/core/queues.mdxdocs/content/docs/shared/guides/core/scheduling.mdxdocs/content/docs/shared/guides/core/tasks.mdxdocs/content/docs/shared/guides/core/workers.mdxdocs/content/docs/shared/guides/extensibility/middleware.mdxdocs/content/docs/shared/guides/extensibility/serializers.mdxdocs/content/docs/shared/guides/integrations/prometheus.mdxdocs/content/docs/shared/guides/integrations/sentry.mdxdocs/content/docs/shared/guides/operations/deployment.mdxdocs/content/docs/shared/guides/operations/keda.mdxdocs/content/docs/shared/guides/operations/mesh.mdxdocs/content/docs/shared/guides/operations/testing.mdxdocs/content/docs/shared/guides/operations/troubleshooting.mdxdocs/content/docs/shared/guides/reliability/circuit-breakers.mdxdocs/content/docs/shared/guides/reliability/error-handling.mdxdocs/content/docs/shared/guides/reliability/guarantees.mdxdocs/content/docs/shared/guides/reliability/idempotency.mdxdocs/content/docs/shared/guides/reliability/locks.mdxdocs/content/docs/shared/guides/reliability/retries.mdxdocs/content/docs/shared/guides/resources/interception.mdxdocs/content/docs/shared/guides/workflows/canvas.mdxdocs/content/docs/shared/guides/workflows/gates.mdxdocs/content/docs/shared/guides/workflows/saga.mdxdocs/content/docs/shared/more/examples/benchmark.mdxdocs/package.jsondocs/scripts/parity/checks/code-tabs.mjsdocs/scripts/parity/checks/collisions.mjsdocs/scripts/parity/checks/drift.mjsdocs/scripts/parity/checks/redirect-shadowing.mjsdocs/scripts/parity/content.mjsdocs/scripts/parity/index.mjsdocs/tsconfig.jsondocs/vite-plugin-docs-manifest.ts
💤 Files with no reviewable changes (73)
- docs/content/docs/java/guides/reliability/error-handling.mdx
- docs/content/docs/node/guides/reliability/circuit-breakers.mdx
- docs/content/docs/python/guides/extensibility/middleware.mdx
- docs/content/docs/node/guides/reliability/locks.mdx
- docs/content/docs/java/guides/core/scheduling.mdx
- docs/content/docs/java/getting-started/quickstart.mdx
- docs/content/docs/java/guides/core/queues.mdx
- docs/content/docs/java/guides/reliability/idempotency.mdx
- docs/content/docs/node/guides/operations/keda.mdx
- docs/content/docs/python/guides/reliability/idempotency.mdx
- docs/content/docs/python/guides/operations/deployment.mdx
- docs/content/docs/python/guides/workflows/sagas.mdx
- docs/content/docs/node/guides/operations/deployment.mdx
- docs/content/docs/python/guides/extensibility/serializers.mdx
- docs/content/docs/python/guides/reliability/guarantees.mdx
- docs/content/docs/java/guides/operations/deployment.mdx
- docs/content/docs/node/getting-started/quickstart.mdx
- docs/content/docs/java/guides/reliability/guarantees.mdx
- docs/content/docs/java/guides/reliability/locks.mdx
- docs/content/docs/java/guides/operations/troubleshooting.mdx
- docs/content/docs/java/guides/workflows/gates.mdx
- docs/content/docs/java/guides/core/tasks.mdx
- docs/content/docs/java/guides/resources/interception.mdx
- docs/content/docs/node/guides/extensibility/serializers.mdx
- docs/content/docs/python/getting-started/quickstart.mdx
- docs/content/docs/node/guides/workflows/gates.mdx
- docs/content/docs/java/guides/core/workers.mdx
- docs/content/docs/node/guides/core/tasks.mdx
- docs/content/docs/node/guides/resources/interception.mdx
- docs/content/docs/node/guides/operations/mesh.mdx
- docs/content/docs/java/guides/operations/testing.mdx
- docs/content/docs/node/guides/operations/testing.mdx
- docs/content/docs/python/guides/integrations/prometheus.mdx
- docs/content/docs/python/guides/reliability/circuit-breakers.mdx
- docs/content/docs/python/more/examples/benchmark.mdx
- docs/content/docs/node/guides/reliability/error-handling.mdx
- docs/content/docs/node/guides/operations/troubleshooting.mdx
- docs/content/docs/python/guides/reliability/locking.mdx
- docs/content/docs/python/guides/core/tasks.mdx
- docs/content/docs/java/guides/extensibility/middleware.mdx
- docs/content/docs/python/guides/workflows/canvas.mdx
- docs/content/docs/java/guides/operations/mesh.mdx
- docs/content/docs/java/guides/workflows/saga.mdx
- docs/content/docs/node/guides/integrations/prometheus.mdx
- docs/content/docs/node/guides/core/scheduling.mdx
- docs/content/docs/node/guides/reliability/guarantees.mdx
- docs/content/docs/python/guides/core/workers.mdx
- docs/content/docs/java/guides/workflows/canvas.mdx
- docs/content/docs/java/guides/core/predicates.mdx
- docs/content/docs/node/guides/workflows/canvas.mdx
- docs/content/docs/node/guides/integrations/sentry.mdx
- docs/content/docs/java/guides/integrations/sentry.mdx
- docs/content/docs/java/guides/extensibility/serializers.mdx
- docs/content/docs/node/guides/core/workers.mdx
- docs/content/docs/node/guides/workflows/saga.mdx
- docs/content/docs/python/guides/reliability/error-handling.mdx
- docs/content/docs/node/guides/reliability/retries.mdx
- docs/content/docs/node/guides/extensibility/middleware.mdx
- docs/content/docs/python/guides/core/scheduling.mdx
- docs/content/docs/python/guides/workflows/gates.mdx
- docs/content/docs/python/guides/reliability/retries.mdx
- docs/content/docs/node/guides/core/predicates.mdx
- docs/content/docs/node/guides/reliability/idempotency.mdx
- docs/content/docs/python/guides/operations/troubleshooting.mdx
- docs/content/docs/node/guides/core/queues.mdx
- docs/content/docs/python/guides/operations/keda.mdx
- docs/content/docs/python/guides/resources/interception.mdx
- docs/content/docs/python/guides/operations/mesh.mdx
- docs/content/docs/python/guides/core/queues.mdx
- docs/content/docs/java/more/examples/benchmark.mdx
- docs/content/docs/java/guides/reliability/retries.mdx
- docs/content/docs/python/guides/integrations/sentry.mdx
- docs/content/docs/node/more/examples/benchmark.mdx
The rules only exist under the Python/Node exporters and assume the default namespace; Java uses Micrometer names.
Check-then-send races overlapping executions; the guarded UPDATE can only be won once.
Wait on the completed counter, not one job handle, and stage jobs before the worker starts to match the other benchmarks.
TAB_RE required sdk to be the first attribute, so a preceding attribute made the parity check report a false missing-SDK error.
One MDX file per shared topic, served at every SDK's URL — ends the three-tree drift where the same topic was 324 lines for Python and 25 for Node.
Architecture
content/docs/shared/x.mdxmounts at/python/x,/node/x,/java/x. Slug + fan-out logic lives in one module (app/lib/doc-slugs.ts) consumed by the runtime loader, the prerender walk, and the manifest plugin — a per-SDK file colliding with a shared file is a hard build error, never a silent override.docs/README.md): SDK-neutral prose,<CodeTabs>for per-SDK code,<SdkOnly>for per-SDK facts,<SdkSwap>/<SdkName>for inline words. All components were already in the site; this PR only reorganizes content around them.<link rel="canonical">to the default-SDK URL;llms.txt/llms-full.txtlist each shared page once. Search keeps three SDK-scoped entries.?sdk=, localStorage, default) so a direct visit to/node/...paints Node variants immediately.pnpm check:parity, wired into docs.yml): blocks on CodeTabs missing an SDK tab on shared pages, slug collisions, and redirect shadowing; prints an informational drift report ranking remaining per-SDK topic pairs — the migration queue.Migrated (25 topics, 75 per-SDK files → 26 shared files)
core (tasks, workers, queues, scheduling, predicates) · reliability (retries, error-handling, guarantees, idempotency, circuit-breakers, locks) · workflows (canvas, gates, saga) · extensibility (serializers, middleware) · operations (deployment, testing, troubleshooting, keda, mesh) · integrations (sentry, prometheus) · resources (interception) · quickstart · examples/benchmark
Name normalization with redirects:
locking → locks,sagas → saga(Python). Java's nav gains circuit-breakers (the SDK has the feature); prometheus/keda stay out of Java's sidebar (Micrometer/autoscaling cover those).Every per-SDK claim in the merged pages was verified against that SDK's source — the pass also fixed ~20 latent doc inaccuracies (fabricated CLI flags, wrong exception/metric names, wrong retry-jitter and scaler-JSON shapes, a canvas chord-compensation gap, middleware hook-order).
Deliberately still per-SDK
api-reference (per-language surface), migration guides (Celery vs BullMQ), dashboard (Python has a subsection), webhooks/events (structure differs), autoscaler vs autoscaling (different features), framework pages, section indexes. The drift report now lists 13 topics — all in these categories.
Verification
pnpm typecheck,biome check,check:parity, and fullpnpm buildgreen.locking/sagasURLs prerender as redirect stubs.data-sdk-variantblocks present, canonical link on alias mounts, sidebar/prev-next/breadcrumbs intact per SDK.?sdk=works on shared pages, GitHub Pages base path handled.Summary by CodeRabbit